跳到主要内容

SpringCloud 配置模板

概述

每次都配置重复的配置文件很麻烦,这里直接创建一个备份用来直接复制

父 pom 文件模板

注意!!!!一定要检测是否有哪个依赖忘记加版本号了,否则它会阻塞 Maven 进程,导致其它模块也无法下载,最常见的坑 spring-security-jwt 需要单独指定版本号,他不在 spring-boot 大礼包里面

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.alsritter</groupId>
<artifactId>cloud</artifactId>
<version>1.0-SNAPSHOT</version>


<!-- 注意!!这个 packaging 标签要放在 modules 标签下面,否则子模块无法使用版本控制-->
<packaging>pom</packaging>

<!-- 统一管理版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.18.16</lombok.version>
<mysql.version>8.0.22</mysql.version>

<druid-spring-boot-starter.version>1.2.5</druid-spring-boot-starter.version>
<mybatis.spring.boot.version>2.1.3</mybatis.spring.boot.version>
<spring-boot.version>2.3.4.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
</properties>

<!--用于统一管理依赖版本-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>

<!--引入spring cloud 的 pom-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>

<!--引入 mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>

<!--spring cloud 阿里巴巴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>

<!--mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
<scope>runtime</scope>
</dependency>

<!-- druid 数据连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid-spring-boot-starter.version}</version>
</dependency>

<!--日志框架-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>

<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>

<!--下面这些 springboot 里面自带了版本控制-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</dependencyManagement>


<!--使用阿里的镜像库-->
<repositories>
<repository>
<id>aliyun-repos</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>aliyun-plugin</id>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>

<!-- 这个插件很重要,它用于打包,注意,可以把这个插件放在父工程 -->
<!-- 执行 mvn clean package 打包 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

问题:pom 父工程 dependencyManagement 中的 jar 包在子工程中不写版本号无法引入的问题

原因是由于 spring-cloud-dependencies 包的版本问题,应当将版本由 Hoxton.SR8 更改为 Hoxton.RELEASE,之后更新一下包问题就解决了。

<dependencies>
<!-- springCloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependencies>

spring-boot-maven-plugin 插件

这里补充一下这个 spring-boot-maven-plugin 插件的使用

spring boot maven 打包不生成可执行 jar 文件

  • 问题描述:spring boot 使用 maven 的 package 命令打出来的包,不是可执行 jar 包,因为包含依赖的 jar 包。
  • 问题原因:打包时使用了 maven 默认的 maven-jar-plugin 插件,而不是 spring-boot-maven-plugin 插件。

解决方法1:pom 中必须配置 spring-boot-maven-plugin 插件,而且 必须指定需要执行的目标构建

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

解决方法2. 使用 spring 的 parent 来进行依赖管理,则不用指定执行构建的目标

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.6.RELEASE</version>
</parent>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
</plugin>
</plugins>
</build>

Note: 请避免直接使用 mvn repackage 命令,因为 repackage 依赖原生 maven 的 package 命令,直接执行 repackage 无法获取依赖,会导致打包失败。

注意:多模块的项目不能把打包插件放到父级 Pom 中,只需在你子模块的 SpringBoot 独立运行的项目模块中依赖即可,如果是公共依赖的子模块(比如我项目中的 core 模块是一个公共依赖)也不需要依赖这个打包插件(否则会因为找不到 main 函数报错)。

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

actuator 监控状态

<!--状态监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
management:
endpoints:
web:
exposure:
include: "*"

数据连接池

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/cloud_stduy?useUnicode=true&characterEncoding=utf8&useSSL=true&useServerPrepStmts=true
username: root
password: root

MyBatis

<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
mybatis:
mapper-locations: classpath:mapper/*.xml
type-aliases-package: com.alsritter.entities # 所有 Entity别名类所在包

热部署

<!--热部署-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
spring:
devtools:
restart:
# 添加那个目录的文件需要 restart
additional-paths: src/main/java
# 排除那个目录的文件不需要 restart
exclude: static/**,public/**
# 想要禁用的话
spring:
devtools:
livereload:
enabled: false

Eureka Server

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

添加配置文件

server:
port: 8761

eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
# 因为没有设置集群,所以这里的 registerWithEureka 和 fetchRegistry 都设置为 false
registerWithEureka: false # false表示不向注册中心注册自己
fetchRegistry: false # false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
serviceUrl:
# 设置与 Eureka Server 交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
#server:
# 关闭自我保护机制,保证不可用服务被及时剔除
#enable-self-preservation: false
#eviction-interval-timer-in-ms: 2000

启动类

@EnableEurekaServer
@SpringBootApplication
public class Eureka7001 {
public static void main(String[] args) {
SpringApplication.run(Eureka7001.class, args);
}
}

Eureka Client

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-client -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

使用注解

@EnableEurekaClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

编写配置文件指定 Eureka Server 的位置

# 注意要指定自己这个服务的名称
spring:
application:
name: "payment-service"

eureka:
client:
# 表示是否将自己注册进 EurekaServer 默认为 true
register-with-eureka: true
# 是否从 EurekaServer 抓取已有的注册信息,默认为 true。单节点无所谓,集群必须设置为 true才能配合 ribbon使用负载均衡
fetch-registry: true
service-url:
# 指定 Eureka Server 的位置
defaultZone: http://localhost:7001/eureka #单机版
# defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版
instance:
instance-id: payment8001
prefer-ip-address: true # 访问路径可以显示IP地址
# Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
# lease-renewal-interval-in-seconds: 1
# Eureka 服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
# lease-expiration-duration-in-seconds: 2